/*
 * This file is a part of the RMI Plugin for Eclipse tutorials.
 * Copyright (C) 2002-7 Genady Beryozkin
 */
package l3.info.Projet.Serveur;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

import java.sql.Connection;

import l3.info.Projet.Client.DialogueBD;
import l3.info.Projet.Client.Utilisateur;
import l3.info.Projet.RMI.RequetesReseau;
//import java.util.HashSet;
import l3.info.Projet.Utilitaires.Configuration;

//import java.util.HashSet;

/**
 * This is a simulation of a printer server. Note that in real application,
 * server level synchronization may be needed.
 * 
 * @Aboulkacem Hamid
 */
public class ServeurRequetes extends UnicastRemoteObject implements
RequetesReseau {

	/**
	 * Nom du serveur rmi
	 */
	private String name;
	private Configuration conf;
	private boolean registryCree = false;
	private String nomBd;
	private String userBd;
	private String passwdBd;
	
	public ServeurRequetes(String name) throws RemoteException {
		conf = new Configuration("configServer.properties");
		this.name = name;
		this.nomBd = conf.valueOf("database");
		this.userBd = conf.valueOf("user");
		this.passwdBd = conf.valueOf("password");
	}

	public ServeurRequetes(String name, int port) throws RemoteException {
		conf = new Configuration("configServer.properties");
		this.name = name;
		this.nomBd = conf.valueOf("database");
		this.userBd = conf.valueOf("user");
		this.passwdBd = conf.valueOf("password");
		
		// On réserve le port
		LocateRegistry.createRegistry(port);

		lancer();
		System.out.println("Le serveur est lancé correctement");
		registryCree = true;
		//arreter();
		//System.out.println("Serveur arrêté !");
	}

	/**
	 * Permet de lancer le serveur
	 */
	public void lancer() {
		try {
			Naming.rebind(name, this);
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Permet d'arrêter le serveur
	 */
	public void arreter() {
		try {
			Naming.unbind(name);
			UnicastRemoteObject.unexportObject(this, true);
			// System.gc();
		} catch (RemoteException e) {
			//e.printStackTrace();
		} catch (MalformedURLException e) {
			//e.printStackTrace();
		} catch (NotBoundException e) {
			//e.printStackTrace();
		}
	}

	public void setRegistryCree(boolean b) {
		registryCree = b;
	}


	public boolean getRegistryCree() {
		return registryCree;
	}
	public void printUtilisateur (Utilisateur u) throws RemoteException {
		System.out.println(u);
	}
	
	/**
	 * Permet de savoir si un utilisateur existe, et si oui,
	 * on va charger toutes ses données, sinon on ne fait rien
	 * @param u, l'utilisateur à connecter
	 * @param urlBd
	 * @param userBd
	 * @param passwdBd
	 * @param tableUser
	 * @param tableMessage
	 */
	public void utilisateurExists(Utilisateur u, String tableUser,
			String tableMessage) throws RemoteException {
		// Gérer le cas de l'utilisateur déjà connecté
		// Regarder dans la liste des utilisateurs connectés si
		// celui-ci ne l'est pas déjà
		Connection conn = DialogueBD.connexionSQL(
				"jdbc:postgresql://localhost/" + nomBd, userBd, passwdBd);
		u.setConn(conn);
		// Aucun utilisateur trouvé, on ne le connecte pas
		if (! DialogueBD.getExistingUserTable(u, tableUser)) {
			u.setConn(null);
		} else {
			// System.out.println(u.getConnexion()); OK !!!
			// sinon il a été trouvé, on charge ses message, les utilisateurs
			// suivis, son pseudo etc.
			DialogueBD.getDataFromUserTableWhenConnected(u, tableUser,
					tableMessage);
		}
	}
	
	public void utilisateurExists(Utilisateur u) throws RemoteException {
		utilisateurExists(u, "Utilisateur", "Message");
		// System.out.println(u.getConnexion()); // NOK !!!, dit n'importe quoi
	}
}